import { getToken, removeToken } from '@/utils/storeage.js'
import store from '../store'
// 36026  创佳 36025 凯勒
const BASEURL = import.meta.env.VITE_APP_BASE_API
// const BASEURL = 'http://saibao.ruiyi.info/api'
export function getBaseUrl() {
	return BASEURL
}

// 标记是否正在刷新令牌
let isRefreshing = false
// 存储等待令牌刷新的请求
let refreshSubscribers = []

// 执行等待的请求
function onRefreshed(token) {
	refreshSubscribers.forEach(callback => callback(token))
	refreshSubscribers = []
}

// 添加请求到等待队列
function subscribeTokenRefresh(callback) {
	refreshSubscribers.push(callback)
}

// 检查令牌是否需要刷新
async function checkTokenRefresh() {
	// 如果已经在刷新过程中，不重复刷新
	if (isRefreshing) return true
	
	// 检查token是否存在
	const token = getToken()
	if (!token) return false
	
	try {
		const loginTime = uni.getStorageSync('login_time_key')
		if (loginTime) {
			const currentTime = new Date().getTime()
			const diffHours = (currentTime - loginTime) / (1000 * 60 * 60)
          
			// 如果登录时间超过23小时，自动刷新令牌
			if (diffHours > 23 && !isRefreshing) {
				isRefreshing = true
				try {
					await store.dispatch('user/refreshToken')
					isRefreshing = false
					return true
				} catch (error) {
					isRefreshing = false
					console.error('令牌刷新失败', error)
					return false
				}
			}
		}
		return true
	} catch (error) {
		console.error('检查令牌错误', error)
		return false
	}
}

export default function request(config) {
	return new Promise(async (resolve, reject) => {
		// 判断是否是重试请求
		const isRetryRequest = config.isRetryRequest === true
		
		// 如果不是登录接口、刷新令牌接口或重试请求，检查令牌是否需要刷新
		if (!config.notToken && !config.url.includes('/app/wxLogin') && 
			!config.url.includes('/app/refreshToken') && !isRetryRequest) {
			// 只有当请求需要令牌时才检查刷新
			await checkTokenRefresh()
		}
		
		const headers = {
			'Content-Type': config.isForm ? 'application/x-www-form-urlencoded;charset=utf-8' : 'application/json;charset=utf-8'
		}
		if (!config.notToken) {
			headers['Authorization'] = 'Bearer ' + getToken()
		}
		if (config.header) {
			Object.keys(config.header).forEach((key) => {
					headers[key] = config.header[key]
			});
		}
		if (!config.isUpload) {
			uni.request({
			    url: BASEURL + config.url,
			    data: config.data,
					method: config.method,
			    header: headers,  
			    success: (res) => {
						if (res.statusCode === 200) {
							if (config.noData) {
								resolve(res)
							} else if (res.data.code === 200 || res.data.code == 0){
								resolve(res.data)
							} else if (res.data.code === 401) {
								// 401表示令牌失效，需要重新登录
								// 已经是重试请求或刷新令牌请求，直接返回失败
								if (isRetryRequest || config.url.includes('/app/refreshToken')) {
									uni.setStorageSync('user_token_key', null)
									uni.hideLoading()
									uni.showToast({
										icon: 'none',
										title: '请先登录'
									})
									reject(res.data.msg)
									return
								}
								
								// 判断是否正在刷新
								if (!isRefreshing) {
									isRefreshing = true
									
									// 尝试刷新令牌
									store.dispatch('user/refreshToken').then(newTokenRes => {
										const newToken = newTokenRes.token
										isRefreshing = false
										
										// 执行队列中的请求
										onRefreshed(newToken)
										
										// 重新发起当前请求
										const retryConfig = {
											...config,
											isRetryRequest: true // 标记为重试请求
										}
										
										request(retryConfig).then(result => {
											resolve(result)
										}).catch(err => {
											reject(err)
										})
									}).catch(() => {
										isRefreshing = false
										// 清空队列
										refreshSubscribers = []
										
										// 刷新失败，提示登录
										uni.setStorageSync('user_token_key', null)
										uni.hideLoading()
										uni.showToast({
											icon: 'none',
											title: '请先登录'
										})
										reject(res.data.msg)
									})
								} else {
									// 将请求加入队列
									subscribeTokenRefresh(() => {
										const retryConfig = {
											...config,
											isRetryRequest: true // 标记为重试请求
										}
										
										request(retryConfig).then(result => {
											resolve(result)
										}).catch(err => {
											reject(err)
										})
									})
								}
							} else {
								uni.showToast({
									icon: 'none',
									title: res.data.msg
								})
								reject(res.data.msg)
							}
						} else {
							reject(res.data.msg)
						}
			    },
					fail: (err) => {
						if (err.data) {
							reject(err.data.msg)
						}
					}
			})
		} else {
			uni.uploadFile({
				url: BASEURL + config.url, //仅为示例，非真实的接口地址
				filePath: config.filePath,
				name: config.name,
				formData: config.formData,
				header: {
					'Authorization': 'Bearer ' + getToken()
				},  
				success: (res) => {
					const data = JSON.parse(res.data)
					if (data.code === 401 && !isRefreshing) {
						// 对于上传文件，如果令牌失效且当前没有正在刷新，则尝试刷新令牌
						isRefreshing = true
						store.dispatch('user/refreshToken').then(() => {
							isRefreshing = false
							// 刷新成功不重试上传，用户需要手动重试
						}).catch(() => {
							isRefreshing = false
							store.dispatch('user/logout')
						})
					}
					resolve(data)
				},
				fail: (err) => {
					reject(err)
				}
			})
		}
	})
}